/*
 * transmisor.cpp
 *
 *  Created on: Dec 13, 2013
 *      Author: m
 */

#include "MessageQueue.h"
#include "ColaRemotaComun.h"
#include "CPrinter.h"
#include "ArchivoIni.h"
#include "RoutingTable.h"

using ipc::MessageQueue;
using ipc::CPrinter;

int main ( int argc, char* argv[] )
{
    int socket;
    int idCola;
    int ack;
    int currentBrokerId;

    MessageQueue<PaqueteColaRemota> colaMensajes =
            MessageQueue<PaqueteColaRemota>::get( IPC_BASEFILE, COLA_MENSAJES_BROKER );

    CPrinter::setHeader("transmisor");

    if (argc != 2)
    {
        CPrinter::printErr( "Error: Cantidad de argumentos invalida" );
        exit(1);
    }

    // Parsear el socket! (viene por argumento)
    sscanf( argv[1], "%d", &socket );

    CPrinter::printOut( "Creado un transmisor de cola remota en el socket: %d", socket );

    // Espero el idCola a la cual debo transmitir mensajes
    recibir( socket, &idCola, sizeof( int ) );

    // Registro que el receptor de la cola esta en este broker
    {
        ArchivoIni configFile( CR_CONFIG_FILE );
        currentBrokerId = StringUtils::StringToNumber<int>( configFile.getValue( "brokerId" ) );
        RoutingTable::setRoute( idCola, currentBrokerId );
    }

    CPrinter::printOut( "El transmisor enviara mensajes a la cola: %d", idCola );

    while ( true )
    {
        PaqueteColaRemota msg;

        // leo un mensaje de la cola de mensajes (ipc local)
        msg = colaMensajes.get( idCola );

        CPrinter::printOut( "Enviando un mensaje con destino: %d", msg.destino );

        // Lo mando por el socket
        bool envioOk = enviar( socket, &msg, sizeof( PaqueteColaRemota ) ) > 0;
        bool recepcionOk = recibir( socket, &ack, sizeof( int ) ) > 0;

        if ( envioOk && recepcionOk )
        {
            if ( ack != 0 )
            {
                CPrinter::printErr( "Error: Error en el ACK" );
                exit( 1 );
            }
        }
        else
        {
            // Vuelvo a poner el mensaje en la cola
            // TODO: Mejorar esto, ya que el mensaje queda al final de la cola!
            colaMensajes.put( idCola, msg );

            CPrinter::printErr( "Error: El socket se cerro del otro lado!" );
            exit( 1 );
        }
    }

    return 0;
}
